
package com.eps.util;



import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import javax.swing.JTable;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;


public class ExcelTableExporter {

private File file;
private JTable table;
private String nombreTab;
private int MARGEN_IZQUIERDO=3;
private int MARGEN_TOP=3;
private String titulo;
private ArrayList datos_tabla;

public ExcelTableExporter(JTable table,File file,String nombreTab, String titulo){
        this.file=file;
        this.table=table;
        this.nombreTab=nombreTab;
        this.titulo = titulo;
}

public boolean export(){
try
{
   
DataOutputStream out=new DataOutputStream(new FileOutputStream(file));

WritableWorkbook w = Workbook.createWorkbook(out);

WritableSheet s = w.createSheet(nombreTab, 0);
s.getSettings().setProtected(true);


/* Format the Font */
    WritableFont wf = new WritableFont(WritableFont.ARIAL,
      14, WritableFont.BOLD);
    wf.setColour(jxl.format.Colour.BLACK);
    WritableCellFormat cf = new WritableCellFormat(wf);
    //cf.setWrap(true);
    cf.setShrinkToFit(true);
    cf.setAlignment(jxl.format.Alignment.CENTRE);
    s.mergeCells(0+MARGEN_IZQUIERDO, 0+MARGEN_TOP, table.getColumnCount()-1+MARGEN_IZQUIERDO, 0+MARGEN_TOP);
    s.addCell(new Label(0+MARGEN_IZQUIERDO, 0+MARGEN_TOP, titulo,cf));


 wf = new WritableFont(WritableFont.ARIAL,
      12, WritableFont.BOLD);
    wf.setColour(jxl.format.Colour.BLACK);
    cf = new WritableCellFormat(wf);
    cf.setAlignment(jxl.format.Alignment.CENTRE);
    cf.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.HAIR,jxl.format.Colour.GRAY_80);
   // cf.setShrinkToFit(true);
    cf.setWrap(true);
    cf.setBackground(jxl.format.Colour.GRAY_25);

    //titulos tabla
    for(int j=0;j<table.getColumnCount();j++){
        s.addCell(new Label(j+MARGEN_IZQUIERDO, 1+MARGEN_TOP, table.getColumnName(j),cf));
    }

    wf = new WritableFont(WritableFont.TAHOMA,
      10, WritableFont.NO_BOLD);
    wf.setColour(jxl.format.Colour.BLACK);
    cf = new WritableCellFormat(wf);
    cf.setShrinkToFit(true);
    cf.setLocked(false);

    //cf.setWrap(true);

    //cuerpo tabla
    for(int i=0;i< table.getRowCount();i++){
            for(int j=0;j<table.getColumnCount();j++){
                    Object objeto=table.getValueAt(i,j);
                     if(objeto instanceof Double){

                        jxl.write.Number n = new jxl.write.Number(j+MARGEN_IZQUIERDO,i+2+MARGEN_TOP,Double.parseDouble(objeto.toString()),cf);
                         s.addCell(n);
                    }
                    else if(objeto instanceof BigDecimal){
                        jxl.write.Number n = new jxl.write.Number(j+MARGEN_IZQUIERDO,i+2+MARGEN_TOP,new Double(((BigDecimal)objeto).doubleValue()),cf);
                         s.addCell(n);
                    }
                    else{
                        
                        s.addCell(new Label(j+MARGEN_IZQUIERDO, i+MARGEN_TOP+2, String.valueOf(objeto),cf));
                    }
            }
    }

    w.write();
    w.close();
    out.close();

    return true;

    }catch(IOException ex){ex.printStackTrace();}
    catch(WriteException ex){ex.printStackTrace();}
    return false;
    }


    public static boolean export(ArrayList datos_tabla,File file,String nombreTab, String titulo){
         int MARGEN_IZQUIERDO_TEMP=3;
         int MARGEN_TOP_TEMP=3;
        ArrayList identificadores = (ArrayList) datos_tabla.remove(datos_tabla.size() - 1);
        ArrayList clases = (ArrayList) datos_tabla.remove(datos_tabla.size() - 1);
        try
        {

        DataOutputStream out=new DataOutputStream(new FileOutputStream(file));

        WritableWorkbook w = Workbook.createWorkbook(out);

        WritableSheet s = w.createSheet(nombreTab, 0);

        /* Format the Font */
            WritableFont wf = new WritableFont(WritableFont.ARIAL,
              14, WritableFont.BOLD);
            wf.setColour(jxl.format.Colour.BLACK);
            WritableCellFormat cf = new WritableCellFormat(wf);
            //cf.setWrap(true);
            cf.setShrinkToFit(true);
            cf.setAlignment(jxl.format.Alignment.CENTRE);
            s.mergeCells(0+MARGEN_IZQUIERDO_TEMP, 0+MARGEN_TOP_TEMP, identificadores.size()-1+MARGEN_IZQUIERDO_TEMP, 0+MARGEN_TOP_TEMP);
            s.addCell(new Label(0+MARGEN_IZQUIERDO_TEMP, 0+MARGEN_TOP_TEMP, titulo,cf));


         wf = new WritableFont(WritableFont.ARIAL,
              12, WritableFont.BOLD);
            wf.setColour(jxl.format.Colour.BLACK);
            cf = new WritableCellFormat(wf);
            cf.setAlignment(jxl.format.Alignment.CENTRE);
            cf.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.HAIR,jxl.format.Colour.GRAY_80);
           // cf.setShrinkToFit(true);
            cf.setWrap(true);
            cf.setBackground(jxl.format.Colour.GRAY_25);

            //titulos tabla
            for(int j=0;j<identificadores.size();j++){
                s.addCell(new Label(j+MARGEN_IZQUIERDO_TEMP, 1+MARGEN_TOP_TEMP, identificadores.get(j).toString(),cf));
            }

            wf = new WritableFont(WritableFont.TAHOMA,
              10, WritableFont.NO_BOLD);
            wf.setColour(jxl.format.Colour.BLACK);
            cf = new WritableCellFormat(wf);
            cf.setShrinkToFit(true);
            //cf.setWrap(true);

            //cuerpo tabla
            for(int i=0;i< datos_tabla.size();i++){
                    ArrayList datos_columna = (ArrayList)datos_tabla.get(i);
                    for(int j=0;j<datos_columna.size();j++){
                            Object objeto=datos_columna.get(j);
                             if(objeto instanceof Double){

                                jxl.write.Number n = new jxl.write.Number(j+MARGEN_IZQUIERDO_TEMP,i+2+MARGEN_TOP_TEMP,Double.parseDouble(objeto.toString()),cf);
                                 s.addCell(n);
                            }
                            else if(objeto instanceof BigDecimal){
                                jxl.write.Number n = new jxl.write.Number(j+MARGEN_IZQUIERDO_TEMP,i+2+MARGEN_TOP_TEMP,new Double(((BigDecimal)objeto).doubleValue()),cf);
                                 s.addCell(n);
                            }
                            else{

                                s.addCell(new Label(j+MARGEN_IZQUIERDO_TEMP, i+MARGEN_TOP_TEMP+2, String.valueOf(objeto),cf));
                            }
                    }
            }

            w.write();
            w.close();
            out.close();

            return true;

        }catch(IOException ex){ex.printStackTrace();}
        catch(WriteException ex){ex.printStackTrace();}
        return false;
        }

}


